iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 19
0
Modern Web

遺留系統重構 - 從 MEAN Stack 轉移到 go-vue-postgresql系列 第 19

Day 19 : 排程 - 用 goroutine 來處理資料

  • 分享至 

  • xImage
  •  

使用 Golang 的 goroutine 來進行排程,
透過建立緩衝區,等待 goroutine 來取得待處理的資料,

package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

const (
	numberGoroutineList = 4
	numberTaskList      = 10
)

var wg sync.WaitGroup

func init() {
	rand.Seed(time.Now().Unix())
}

func main() {
	taskList := make(chan string, numberTaskList)

	wg.Add(numberGoroutineList)
	for gr := 1; gr <= numberGoroutineList; gr++ {
		go worker(taskList, gr)
	}

	for post := 1; post <= numberTaskList; post++ {
		taskList <- fmt.Sprintf("任務 : %d", post)
	}

	close(taskList)

	wg.Wait()
}

func worker(taskList chan string, worker int) {
	defer wg.Done()

	for {
		task, ok := <-taskList
		if !ok {
			fmt.Printf("工人: %d: 關閉\n", worker)
			return
		}

		fmt.Printf("工人: %d: 開始 %s\n", worker, task)

		sleep := rand.Int63n(100)
		time.Sleep(time.Duration(sleep) * time.Millisecond)

		fmt.Printf("工人: %d: 完成 %s\n", worker, task)
	}
}

taskList 是作為緩衝區,使用 make(chan string, 10) 產生
go worker() 產生 goroutine 來進行作業

taskList <- 放進去通道中
<-taskList 從通道中取出

AomaShinku:goroutine aomashinku$ go run main.go
工人: 4: 開始 任務 : 4
工人: 2: 開始 任務 : 1
工人: 3: 開始 任務 : 2
工人: 1: 開始 任務 : 3
工人: 3: 完成 任務 : 2
工人: 3: 開始 任務 : 5
工人: 1: 完成 任務 : 3
工人: 1: 開始 任務 : 6
工人: 2: 完成 任務 : 1
工人: 2: 開始 任務 : 7
工人: 4: 完成 任務 : 4
工人: 4: 開始 任務 : 8
工人: 1: 完成 任務 : 6
工人: 1: 開始 任務 : 9
工人: 3: 完成 任務 : 5
工人: 3: 開始 任務 : 10
工人: 4: 完成 任務 : 8
工人: 4: 關閉
工人: 1: 完成 任務 : 9
工人: 1: 關閉
工人: 2: 完成 任務 : 7
工人: 2: 關閉
工人: 3: 完成 任務 : 10
工人: 3: 關閉
AomaShinku:goroutine aomashinku$

完成用 goroutine 來處理資料


上一篇
Day 18 : 子模組 - 使用 go mod 管理專案內的子模組
下一篇
Day 20 : 前端路由 - 使用 vue-route 來控制
系列文
遺留系統重構 - 從 MEAN Stack 轉移到 go-vue-postgresql30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言